#ifndef GUNI_H
#define GUNI_H

#include <QDialog>
#include <QMainWindow>
#include <QStringListModel>
#include <QMessageBox>
#include <QFile>
#include "listeeleve.h"
#include "listeprof.h"
#include "biblistring.h"
#include "listetypecours.h"
#include "gunioption.h"
#include "UI/fensaisiepaiement.h"
#include "UI/fensaisieprof.h"
#include "UI/fensaisietypecours.h"
#include "UI/fensaisiecourspardefaut.h"
#include "UI/fensaisiecours.h"
#include "UI/fensaisieeleve.h"
#include "UI/frmlistetypedecours.h"
#include "UI/frmlisteeleve.h"
#include "UI/frmlisteprof.h"
#include "UI/fenresultateleve.h"
#include "UI/fenresultatprof.h"
#include "UI/fenoption.h"
#include "UI/fenaboutguni.h"
#include "UI/fencalendrier.h"
#include "UI/fenimprimerfacture.h"
#include "UI/fensaisieplusieurscours.h"
#include "listepaiementParProfEtEleve.h"
#include "UI/fenlistetotaldespaiements.h"
#include "UI/fenresultatglobal.h"

namespace Ui {
    class Guni;

}

class Guni : public QMainWindow
{
    Q_OBJECT

public:
    explicit Guni(QWidget *parent = 0);
    ~Guni();

    QStringList ListeOption;
    QStringListModel *modele;

    void InitialiseApp();
    void ChargementDonnees();
    void SauvegardeDonnees();
    bool SauvegardeVersFichier(QString filename, QString Datas);
    QString ChargementDepuisFichier(QString filename);
    void ChargementListeInstru(QString datas);

    void ConnectionSignauxSlots();
    void CreerMenu();
    void CreerBarreOutils();
    void RaccourciClavier();
    void CreationFichierTemp();
    void FusionEleve(QString NomEleveFusion);
    void ChargerListeEleve();
    void InitialisationFenetre();

public slots:
    void saveAsToFile();
    void loadFromFile();
    void SauvegardeAvantFermeture();

private slots:
       void Quitter();
       void EnvoiSignaux();
       void OuvreFenTypeCours();
       void OuvreFenTypeCours(TypeCours tpc, int monIndex);
       void OuvreFenSaisieProf();
       void OuvreFenSaisieProf(Prof prof, int monIndex);
       void OuvreFenSaisieEleve();
       void OuvreFenSaisieEleve(Eleve ele, int monIndex);
       void OuvreFenSaisieCours();
       void OuvreFenSaisieCours(Eleve ele);
       void OuvreFenSaisieCours(Eleve eleve, Cours cours, int monIndex);
       void OuvreFenSaisiePaiement(int indexEleve);
       void OuvreFenSaisiePlusieursCours(Eleve ele);

       void OuvreFrmListeEleve();
       void OuvreFrmListeProf();
       void OuvreFrmListeTypeCours();
       void OuvreFrmListeTotalDesPaiements();

       void OuvreFenResultatProf();
       void OuvreFenResultatProf(Prof);
       void OuvreFenResultatEleve(int);
       void OuvreCalendrier();

       void NouvelExercice();
       void OuvreFenImprimerFacture();
       void OuvreFenetreOption();
       void OuvreFenetreAProposDe();

       void ModifierTypeCours(TypeCours);

       void SupprimerEleve(ListeEleve);
       void ModifierEleve(int);

       bool FusionEleve(int);

       void SupprimerCours(Eleve, Cours);

       void SupprimerPaiement(Eleve, Paiement);

       void ValiderCotisation(Eleve);

       void VisibleInvisible(int);

       void ReceptionListeInstru(QStringList);
       void ReceptionOptions(GuniOption);

       void ConnectionProf();
       void ConnectionProf(bool ConnectionAuto);

       void CheckForUpdate();

       void ImportFichier();
       void ChargerAncienFichier();


signals:
       void TransmetQStringList(QStringList);
       void TransmetOptions(GuniOption);
       void TransmetListeTypeCours(ListeTypeCours);
       void TransmetListeProf(ListeProf);
       void TransmetListeEleve(ListeEleve &le);
       void TransmetData(ListeEleve &le, ListeProf &lp);
       void TransmetListeEleveEtProfConnecte(ListeEleve&, Prof, bool);
       void TransmetListeEleveEtProf(ListeEleve, ListeEleve, Prof);
       void TransmetEleve(Eleve);
       void TransmetEleve(int, ListeEleve &le);
       void TransmetListeChargementComboBox(QStringList, ListeTypeCours, ListeProf, ListeEleve);
       void TransmetListeListePaiement(ListePaiementParProfEtEleve);

       void ModifierTypeCoursIsON(bool, int, TypeCours);
       void ModifierProfIsON(bool, int, Prof);
       void ModifierEleveIsON(int, Eleve);
       void ModifierCoursIsON(bool, int, Eleve,  Cours);


private:
    Ui::Guni *ui;
    QString fichierEnCours;
    QString fListeTypeCours;
    QString dataPath;
    QString DataPathSauvegarde;
    ListeTypeCours maListeTypeCours;
    ListeProf maListeProf;
    ListeEleve maListeEleve;
    ListePaiementParProfEtEleve maListePaiementParProfEtEleve;
    QStringList ListeInstru;
    Prof ProfConnect;
    bool ProfConnectEtat;
    GuniOption mesOptions;
    QString version;

    QMenuBar *BarreDeMenu;
    QMenu *menuFichier;
    QMenu *menuAffichage;
    QMenu *menuOutils;
    QMenu *menuFenetre;
    QMenu *menuAide;
    QMenu *menuNouveau;
    QMenu *menuExporter;
    QMenu *menuImporter;

    QAction *actionConnection;
    QAction *actionOuvrir;
    QAction *actionSauvegarder;
    QAction *actionSauvegarderSous;
    QAction *actionImprimer;
    QAction *actionParametres;
    QAction *actionNouvelExercice;
    QAction *actionCharger;
    QAction *actionQuitter;

    QAction *actionNouveauProf;
    QAction *actionNouveauEleve;
    QAction *actionNouveauCours;
    QAction *actionNouveauTypeCours;

    QAction *actionExportProf;
    QAction *actionExportEleve;
    QAction *actionExportListeProf;
    QAction *actionExportListeEleve;

    QAction *actionImportProf;
    QAction *actionImportEleve;
    QAction *actionImportListeProf;
    QAction *actionImportListeEleve;

    QAction *actionResultatProf;
    QAction *actionResultatEleve;
    QAction *actionListeProfs;
    QAction *actionListeEleves;
    QAction *actionListeTypesCours;
    QAction *actionListeTotalPaiement;
    QAction *actionCalendrier;

    QAction *actionCascade;
    QAction *actionTile;
    QAction *actionToutFermer;

    QAction *actionAbout;
    QAction *actionCheckForUpdate;

    QStatusBar *barreEtat;
    QLabel *labelEtat;

    frmListeEleve *vueListeEleve;
    frmListeTypeDeCours *vueListetypeCours;
    frmListeProf *vueListeProf;

    FenResultatEleve *vueResultatEleve;
    fenResultatGlobal *vueResultatGlobal;
    FenResultatProf *vueResultatProf;

    fenListeTotalDesPaiements *vueListeTotalDesPaiements;
    FenCalendrier *fenCalendrier;

    bool CreationDossier(QString NomDossier);
    void HideFenUI();
};


#endif // GUNI_H
